package cn.edu.ctbu.web.service;


import cn.edu.ctbu.web.dao.StudentCourse;
import cn.edu.ctbu.web.dao.StudentGrade;
import cn.edu.ctbu.web.domain.Student;
import cn.edu.ctbu.web.mapper.CourseMapper;
import cn.edu.ctbu.web.mapper.GradeMapper;
import cn.edu.ctbu.web.repository.StudentRepository;
import cn.edu.ctbu.web.service.impl.IStudentService;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service
public class StudentService implements IStudentService {

    @Autowired
    private StudentRepository studentRepository;

    @Resource
    private CourseMapper courseMapper;

    @Resource
    private GradeMapper gradeMapper;

    /**
     * 使用学号+密码进行登录
     * @param no 学号
     * @param password 密码
     * @return 与学号和密码匹配的学生
     */
    public List<Student> findByNoAndPassword(String no, String password){
        return studentRepository.findByNoAndPassword(no, password);
    }

    /**
     * 使用学号来查询学生个人信息
     * @param no 学号
     * @return 学生个人信息
     */
    public Student findByNo(String no){
        return studentRepository.findByNo(no);
    }

    /**
     * 使用学号查询选课信息
     *
     * @param no 学号
     * @return 选课信息
     */
    public Page<StudentCourse> findCourseByNoStudent(@Param("no") String no, Pageable pageable) {
        // 获取所有符合条件的课程
        List<StudentCourse> allCourses = courseMapper.findCourseByNoStudent(no, pageable);

        // 获取总记录数
        long total = courseMapper.countCoursesByNoStudent(no);

        // 手动进行分页
        int start = (int) pageable.getOffset();
        int end = Math.min((start + pageable.getPageSize()), allCourses.size());
        List<StudentCourse> pageContent = allCourses.subList(start, end);

        // 创建 Page 对象
        return new PageImpl<>(pageContent, pageable, total);
    }

    /**
     * 使用学号查询课程成绩信息
     * @param no 学号
     * @return 课程成绩信息
     */
    public Page<StudentGrade> findGradeByNoStudent(@Param("no") String no, Pageable pageable){
        // 获取所有符合条件的课程
        List<StudentGrade> allGrades = gradeMapper.findGradeByNoStudent(no, pageable);

        // 获取总记录数
        long total = gradeMapper.countGradesByNoStudent(no);

        // 手动进行分页
        int start = (int) pageable.getOffset();
        int end = Math.min((start + pageable.getPageSize()), allGrades.size());
        List<StudentGrade> pageContent = allGrades.subList(start, end);

        // 创建 Page 对象
        return new PageImpl<>(pageContent, pageable, total);
    }

    /**
     * 查找所有学生的信息——用于admin实现显示学生信息功能
     * @return 所有学生的信息
     */
    public Page<Student> findAllStudent(Pageable pageable){
        return studentRepository.findAll(pageable);
    }

    /**
     * 查询所有学生的信息——用于反强制登录
     * @return 所有学生的信息
     */
    public List<Student> findAllStudent(){
        return studentRepository.findAll();
    }

    /**
     * 新增学生表信息
     * @param student 学生对象
     * @return student
     */
    public Student insert(Student student) {
        studentRepository.save(student);
        return student;
    }

    /**
     * 按名字进行查询
     * @param pageable 未
     * @param name 学生姓名
     * @return studentrepository.findByName(name, pageable)
     */
    public Page<Student> findByName(String name, Pageable pageable) {
        return studentRepository.findByName(name, pageable);
    }

    /**
     * 按学号进行查询
     * @param pageable 未
     * @param no 学生学号
     * @return studentrepository.findByNo(no, pageable)
     */
    public Page<Student> findByNo(String no, Pageable pageable) {
        return studentRepository.findByNo(no, pageable);
    }

    /**
     * 按id进行查询
     * @param pageable 未
     * @param id 学生id
     * @return studentrepository.findById(id, pageable);
     */
    public Page<Student> findById(Integer id, Pageable pageable) {
        return studentRepository.findById(id, pageable);
    }

    /***
     *  更新
     *  更新职工信息
     * @return
     */
    public Student update(Student student) {

        studentRepository.save(student);
        return student;
    }

    /***
     *  删除
     *  删除职工信息
     */
    public void delete(Student student) {
        studentRepository.delete(student);
    }

    /**
     * 按id进行查询 - updata
     * @param id 学生id
     * @return studentrepository.findById(id).orElse( null)
     */
    public Student findById(Integer id) {
        return studentRepository.findById(id).orElse( null);
    }
}
